[PR]

水無瀬の部屋 > Programming > sample > goddess > goddess.cpp
最終更新日: 2007/03/29

   1: //*********************************************************
   2: // プロジェクト: ああっ壁神さまっ
   3: //   ファイル名: goddess.cpp
   4: //*********************************************************
   5: #include "goddess.h"
   6: #include "cmdline.h"
   7: #include "instdlg.h"  //
   8: #include <relation/relation.h>
   9: #include <susie/susie.h>
  10: 
  11: 
  12: //---------------------------------------------------------
  13: // テスト関数 の 宣言
  14: //---------------------------------------------------------
  15: DECLARE_TESTPROC( test_cmdline );
  16: 
  17: 
  18: //---------------------------------------------------------
  19: // マクロ定数 の 定義
  20: //---------------------------------------------------------
  21: //
  22: #define MUTEX_INSTALLDLG  ( "goddess.InstallDlg" )
  23: //
  24: #define MODE_GODDESS                  ( 1 )                     // 
  25: #define MODE_INSTALL                  ( 2 )                     // インストール
  26: #define REGPATH_CONTROLPANEL_DESKTOP  "Control Panel\\desktop"  //
  27: //
  28: #define PARAM_CENTER                  "/center"
  29: #define PARAM_TILE                    "/tile"
  30: #define PARAM_ZOOM                    "/zoom"
  31: 
  32: 
  33: //---------------------------------------------------------
  34: // ファイルスコープ関数 の 宣言
  35: //---------------------------------------------------------
  36: static int GetApplicationMode( int argc, char **argv );
  37: static int CommandLineApplicationMainProc( HINSTANCE hInstance, int argc, char **argv );
  38: static int ApplicationInstallMainProc( HINSTANCE hInstance, int argc, char **argv );
  39: 
  40: 
  41: //---------------------------------------------------------
  42: // ファイルスコープ変数 の 定義
  43: //---------------------------------------------------------
  44: static const struct
  45: 	{
  46: 		const char *param;
  47: 		const char *style; 
  48: 		const char *tiling;
  49: 	}
  50: params[] =
  51: 	{
  52: 		{ PARAM_CENTER, "0", "0" }, // 中央
  53: 		{ PARAM_TILE,   "0", "1" }, // 並べて
  54: 		{ PARAM_ZOOM,   "2", "0" }, // 拡大
  55: 	};
  56: 
  57: 
  58: //*********************************************************
  59: // ApplicationMainProc
  60: //*********************************************************
  61: int
  62: ApplicationMainProc
  63: 	(
  64: 		HINSTANCE   hInstance,
  65: 		int         argc,
  66: 		char      **argv
  67: 	)
  68: {
  69: 	// パラメタの仮定
  70: 	ASSERT( IsValidInstanceHandle( hInstance ) );
  71: 	ASSERT( IsValidArgcArgv( argc, argv ) );
  72: 	ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
  73: 
  74: 	//
  75: 	const int mode = GetApplicationMode( argc, argv );
  76: 	switch( mode )
  77: 	{
  78: 		default:           return EXIT_FAILURE;
  79: 		case MODE_GODDESS: return CommandLineApplicationMainProc( hInstance, argc, argv );
  80: 		case MODE_INSTALL: return ApplicationInstallMainProc( hInstance, argc, argv );
  81: 	}	
  82: }//ApplicationMainProc
  83: 
  84: 
  85: //******************************************************************************************************************
  86: // private
  87: //******************************************************************************************************************
  88: //*********************************************************
  89: // GetApplicationMode
  90: //*********************************************************
  91: static
  92: int
  93: GetApplicationMode
  94: 	(
  95: 		int    argc,
  96: 		char **argv
  97: 	)
  98: {
  99: 	// パラメタの仮定
 100: 	ASSERT( IsValidArgcArgv( argc, argv ) );
 101: 	ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
 102: 
 103: 	// 引数が無ければ 設定 モード
 104: 	return (1 < argc) ? MODE_GODDESS : MODE_INSTALL ;
 105: }//GetApplicationMode
 106: 
 107: 
 108: //******************************************************************************************************************
 109: // private - MODE_INSTALL
 110: //******************************************************************************************************************
 111: //*********************************************************
 112: // ApplicationInstallMainProc
 113: //*********************************************************
 114: static
 115: int
 116: ApplicationInstallMainProc
 117: 	(
 118: 		HINSTANCE   hInstance,
 119: 		int         argc,
 120: 		char      **argv
 121: 	)
 122: {
 123: 	// パラメタの仮定
 124: 	ASSERT( IsValidInstanceHandle( hInstance ) );
 125: 	ASSERT( IsValidArgcArgv( argc, argv ) );
 126: 	ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
 127: 
 128: 	//
 129: 	HANDLE hMutex = CreateMutexOnce( MUTEX_INSTALLDLG );
 130: 	if ( hMutex )
 131: 	{
 132: 		InstallDlg( HWND_DESKTOP );
 133: 		VERIFY( CloseHandle( hMutex ) );
 134: 	}
 135: 
 136: 	return EXIT_SUCCESS;
 137: }//ApplicationInstallMainProc
 138: 
 139: 
 140: //******************************************************************************************************************
 141: // private - MODE_GODDESS
 142: //******************************************************************************************************************
 143: static bool ParseCmdLine( WALLPAPAER_t *pwp, int argc, char **argv );
 144: 
 145: 
 146: //*********************************************************
 147: // CommandLineApplicationMainProc
 148: //*********************************************************
 149: static
 150: int
 151: CommandLineApplicationMainProc
 152: 	(
 153: 		HINSTANCE   hInstance,
 154: 		int         argc,
 155: 		char      **argv
 156: 	)
 157: {
 158: 	// パラメタの仮定
 159: 	ASSERT( IsValidInstanceHandle( hInstance ) );
 160: 	ASSERT( IsValidArgcArgv( argc, argv ) );
 161: 	ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
 162: 	
 163: 
 164:     // 希望する壁紙・壁紙モードの取得
 165: 	WALLPAPAER_t wp;
 166: 	if ( !ParseCmdLine( &wp, argc, argv ) )
 167: 	{
 168: 		return 0;
 169: 	}
 170: 
 171:     // Susie plug-in を見つける
 172: 	char susie[ MAX_PATH_BUF ];
 173: 	VERIFY( GetSusiePluginPath( susie, sizeof(susie) ) );
 174: 	if ( !IsPathExist( susie ) )
 175: 	{
 176: 		GetModuleFileLocation( susie, numof(susie) );
 177: 	}
 178: 
 179: 	// 壁紙・壁紙モードの変更作業
 180: 	HKEY hkeyCplDesktop;
 181: 	if ( OpenRegKey( HKEY_CURRENT_USER, REGPATH_CONTROLPANEL_DESKTOP, KEY_ALL_ACCESS, &hkeyCplDesktop ) )
 182: 	{
 183: 		// 現状の保存
 184: 		WALLPAPAER_t wpOld;
 185: 		RegGetWallPaperInfo( hkeyCplDesktop, &wpOld );
 186: 
 187: 		// 壁紙・壁紙モードの変更
 188: 		// 変更失敗時には Windows の設定が無効になるので、
 189: 		// 元の状態に戻すのはプログラムの責任。
 190: 		RegSetWallPaperMode( hkeyCplDesktop, &wp );
 191: 		if ( !SetWallPaperFileEx( wp.FileName, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE, susie ) )
 192: 		{
 193: 			// 壁紙・壁紙モードの復帰
 194: 			RegSetWallPaperMode( hkeyCplDesktop, &wpOld );
 195: 			VERIFY( SetWallPaperFile( wpOld.FileName, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE ) );
 196: 		}
 197: 		VERIFY( CloseRegKey( hkeyCplDesktop ) );
 198: 	}
 199: 
 200: 	return EXIT_SUCCESS;
 201: }//CommandLineApplicationMainProc
 202: 
 203: 
 204: //******************************************************************************************************************
 205: //
 206: //******************************************************************************************************************
 207: //*********************************************************
 208: // ParseCmdLine
 209: //*********************************************************
 210: static
 211: bool
 212: ParseCmdLine
 213: 	(
 214: 		WALLPAPAER_t  *wp,
 215: 		int            argc,
 216: 		char         **argv
 217: 	)
 218: {
 219: 	CALLONCE_TESTPROC( test_cmdline ); // [テスト]
 220: 
 221: 	// パラメタの仮定
 222: 	ASSERT( IsValidPtr( wp, sizeof( *wp ) ) );
 223: 	ASSERT( IsValidArgcArgv( argc, argv ) );
 224: 	ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
 225: 
 226: 	// 初期値
 227: 	memzero( wp, sizeof( *wp ) );
 228: 	strcopy( wp->Style, numof(wp->Style), "0" );
 229: 	strcopy( wp->Tiling, numof(wp->Tiling), "0" );
 230: 	strcopy( wp->FileName, numof(wp->FileName), "" );
 231: 
 232: 	// 現状の取得
 233: 	HKEY hkeyCplDesktop;
 234: 	if ( OpenRegKey( HKEY_CURRENT_USER, REGPATH_CONTROLPANEL_DESKTOP, KEY_ALL_ACCESS, &hkeyCplDesktop ) )
 235: 	{
 236: 		RegGetWallPaperInfo( hkeyCplDesktop, wp );
 237: 		VERIFY( CloseRegKey( hkeyCplDesktop ) );
 238: 	}
 239: 
 240: 	// 引数に従って初期化
 241: 	{for( int i = 1; i < argc; ++i )
 242: 	{
 243: 		ASSERT( IsValidStringPtr( argv[ i ] ) );
 244: 
 245: 		if ( IsPathFile( argv[ i ] ) )
 246: 		{
 247: 			strcopy( wp->FileName, numof(wp->FileName), argv[i] );
 248: 		}
 249: 		else
 250: 		{
 251: 			// 表示方法の指定があれば
 252: 			{for( int j = 0; j < numof(params); ++j )
 253: 			{
 254: 				if ( streqli( argv[ i ], params[ j ].param ) )
 255: 				{
 256: 					strcopy( wp->Style, numof(wp->Style),  params[ j ].style );
 257: 					strcopy( wp->Tiling, numof(wp->Tiling), params[ j ].tiling );
 258: 				}
 259: 			}}
 260: 		}
 261: 	}}
 262: 
 263: 	return (1 < argc) && IsPathExist( wp->FileName );
 264: }//ParseCmdLine
 265: 
 266: 
 267: //******************************************************************************************************************
 268: // TEST
 269: //******************************************************************************************************************
 270: 
 271: 
 272: #ifdef _DEBUG // デバッグ時のみ
 273: 
 274: 
 275: //*********************************************************
 276: // test_cmdline
 277: //*********************************************************
 278: DEFINE_TESTPROC( test_cmdline )
 279: {
 280: 	//---------------------------------------------------------
 281: 	// 定数 の テスト
 282: 	//---------------------------------------------------------
 283: 
 284: 	// 表示方法の指定があれば
 285: 	{for( int i = 0; i < numof(params); ++i )
 286: 	{
 287: 		ASSERT( IsValidStringPtr( params[ i ].param ) );
 288: 		ASSERT( IsValidStringPtr( params[ i ].style ) );
 289: 		ASSERT( IsValidStringPtr( params[ i ].tiling ) );
 290: 	}}
 291: 
 292: 
 293: 	//---------------------------------------------------------
 294: 	// ファイルスコープ関数 の テスト
 295: 	//---------------------------------------------------------
 296: 
 297: 	//---------------------------------------------------------
 298: 	// 公開関数 の テスト
 299: 	//---------------------------------------------------------
 300: 
 301: }//test_cmdline
 302: 
 303: 
 304: #endif // #ifdef _DEBUG
 305: 
 306: 
 307: //** end **

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > goddess > goddess.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/goddess/goddess_cpp.shtml
同人ダウンロード販売
同人ダウンロード販売|DL.Getchu.com